package main

import (
	"fmt"
	"sync"
)

//不加锁而导致的并发冲突示例

func add(count *int, wg *sync.WaitGroup) {
	for i := 0; i < 1000; i++ {
		*count++ //问题出在这里，它不是原子性的
	}
	wg.Done()
}

func main() {
	count := 0
	var wg sync.WaitGroup
	wg.Add(5)
	go add(&count, &wg)
	go add(&count, &wg)
	go add(&count, &wg)
	go add(&count, &wg)
	go add(&count, &wg)

	wg.Wait()
	//看起来count似乎应该等于5000，但实际上不一定，可以多运行几次看看效果
	//原因就在于这几个协程在执行时，先读取 count 再更新 count 的值，而这个过程并不具备原子性
	fmt.Println(count)
}
